/*
 *  Copyright (c) 2001 Sun Microsystems, Inc.  All rights
 *  reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions
 *  are met:
 *
 *  1. Redistributions of source code must retain the above copyright
 *  notice, this list of conditions and the following disclaimer.
 *
 *  2. Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in
 *  the documentation and/or other materials provided with the
 *  distribution.
 *
 *  3. The end-user documentation included with the redistribution,
 *  if any, must include the following acknowledgment:
 *  "This product includes software developed by the
 *  Sun Microsystems, Inc. for Project JXTA."
 *  Alternately, this acknowledgment may appear in the software itself,
 *  if and wherever such third-party acknowledgments normally appear.
 *
 *  4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA"
 *  must not be used to endorse or promote products derived from this
 *  software without prior written permission. For written
 *  permission, please contact Project JXTA at http://www.jxta.org.
 *
 *  5. Products derived from this software may not be called "JXTA",
 *  nor may "JXTA" appear in their name, without prior written
 *  permission of Sun.
 *
 *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 *  DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 *  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 *  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 *  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 *  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 *  SUCH DAMAGE.
 *  ====================================================================
 *
 *  This software consists of voluntary contributions made by many
 *  individuals on behalf of Project JXTA.  For more
 *  information on Project JXTA, please see
 *  <http://www.jxta.org/>.
 *
 *  This license is based on the BSD license adopted by the Apache Foundation.
 *
 *  $Id: JxtaNodeLoader.java,v 1.3 2005/08/25 16:43:42 nano Exp $
 */

package net.jxta.myjxta.ui.graph;

import edu.berkeley.guir.prefuse.ItemRegistry;
import edu.berkeley.guir.prefuse.graph.external.ExternalEntity;
import edu.berkeley.guir.prefuse.graph.external.ExternalNode;
import edu.berkeley.guir.prefuse.graph.external.ExternalTreeNode;
import edu.berkeley.guir.prefuse.graph.external.GraphLoader;
import net.jxta.myjxta.util.objectmodel.*;

import java.util.Iterator;

/**
 *
 * @version $Id: JxtaNodeLoader.java,v 1.3 2005/08/25 16:43:42 nano Exp $
 *
 * @author james todd [gonzo at jxta dot org]
 */

public class JxtaNodeLoader
        extends GraphLoader {
    
    public static final String LABEL = "label";
    public static final String ID = "id";
    public static final String IMAGE = "image";

    public JxtaNodeLoader(ItemRegistry registry) {
        super(registry, ID);

    }
    
    public ExternalEntity loadNode(int type, JxtaNode jn) {
        ExternalEntity ee = null;
        ExternalEntity pe = null;
        JxtaNode pn = jn;


        while ((pn = (JxtaNode)MyJxtaObjectRepository.getObjectRepository().getParent(pn)) != null ) {
            ee = loadNode(GraphLoader.LOAD_PARENT, pn);
            
            if (pe == null) {
                pe = ee;
            }
        }
        
        return loadNode(type, pe, jn);
    }
    
    public ExternalEntity loadNode(int type, ExternalEntity o, JxtaNode jn) {
        
        ExternalEntity n = null;
        String id = MyJxtaObjectRepository.getObjectRepository().getNormalizedPath(jn);
        
        if (m_cache.containsKey(id)) {
            n = (ExternalEntity)m_cache.get(id);
            
        } else {
            if (type == GraphLoader.LOAD_NEIGHBORS) {
                n = new ExternalNode();
                
            } else {
                n = new ExternalTreeNode();
                
            }
            
            
            
            n.setAttribute(IMAGE,  getImageLocation(jn));
            n.setAttribute(LABEL, jn.toString());
            n.setAttribute(ID, id);
        }
        
        foundNode(type, o, n, null);
        
        return n;
    }
    
    /* Gets the Imagelocation of this Nodes image resource. This location is
     * added in Graph.java as a resource to ImageFactory
     * @param jxtanode
     * @return String location of image resource
     */
    private String getImageLocation(JxtaNode jn) {
        // xxx: if we had an image location attribute in jxtanode we could have
        //      personal icons attached to groups and peers
        String imageLocation = null;
        if( jn != null) {
            if(jn instanceof GroupNode) {
                imageLocation = "TreeTable.PeerGroup";
            }
            if(jn instanceof ShareNode) {
                imageLocation = "TreeTable.Share";
            }
            if(jn instanceof PeerNode) {
                imageLocation = "TreeTable.PeerPresent";
            }
        }
        //default image is needed
        if(imageLocation == null) {
            imageLocation = "TreeTable.PeerPresent";
        }
        
        return imageLocation;
    }
    
    protected void getNeighbors(ExternalNode n) {
        JxtaNode jn = getNode(n.getAttribute(ID));
        JxtaNode pn= MyJxtaObjectRepository.getObjectRepository().getParent(jn);
        
        if (pn != null) {
            loadNode(GraphLoader.LOAD_NEIGHBORS, n, pn);
            
            for (Iterator c = pn.getChildren(); c.hasNext(); ) {
                loadNode(GraphLoader.LOAD_NEIGHBORS, n,
                        (JxtaNode)c.next());
            }
        }
    }
    
    protected void getChildren(ExternalTreeNode n) {
        JxtaNode jn = getNode(n.getAttribute(ID));
        MyJxtaObjectRepository objectRepository = MyJxtaObjectRepository.getObjectRepository();
        int count=objectRepository.getChildCount(jn);
        for (int i=0;i<count;i++){
            loadNode(GraphLoader.LOAD_CHILDREN, n,
                    (JxtaNode)objectRepository.getChild(jn,i));

        }
       for (Iterator c = jn.getChildren(); c.hasNext(); ) {
          loadNode(GraphLoader.LOAD_CHILDREN, n,
                    (JxtaNode)c.next());
       }
    }
    
    protected void getParent(ExternalTreeNode n) {
        
        JxtaNode jn = getNode(n.getAttribute(ID));
        if(jn != null) {
            JxtaNode pn= MyJxtaObjectRepository.getObjectRepository().getParent(jn);
//            JxtaNode pn = (JxtaNode)jn.getParent();
            
      
            if (pn != null) {
                loadNode(GraphLoader.LOAD_PARENT, n, pn);
            }
        }
    }
    
    private JxtaNode getNode(String path) {
        return MyJxtaObjectRepository.getObjectRepository().getNodeFromNormalizedPath(path);
    }
}
